#ifndef CPP_CONTEXT_H
#define CPP_CONTEXT_H

#include <Global.h>
#include <KeyEvent.h>

class Activity;

//@brief 上下文对象
//@author cvte
class Context : public KeyEvent::Callback{
   public:
    friend class ViewGroup;
    friend class MainWindow;
    Context();
    ~Context();

    //@method 设置名称字符串标识
    void setName(const std::string& name);
    //@method 获取名称字符串标识
    std::string getName();
    //@method 获取栈顶Activity名称字符串标识
    std::string getTopmostActivityName();
    //@method 开始一个Activity，已不推荐使用此函数，推荐使用MainWindow::switchActivity
    void startActivity(const std::string& activityName);
    //@method 退出一个Activity，已不推荐使用此函数，推荐使用MainWindow::switchActivity
    void stopActivity(Activity* activity);
    //@method 退出一个Activity，已不推荐使用此函数，推荐使用MainWindow::switchActivity
    void stopActivity(const std::string& activityName);
    //@method 退出栈顶Activity并开始一个Activity，已不推荐使用此函数，推荐使用MainWindow::switchActivity
    void stopTopAndStartActivity(const std::string& activityName);
    //@method 退出后台所有Activity并开始一个Activity，已不推荐使用此函数，推荐使用MainWindow::switchActivity
    void stopAllAndStartActivity(const std::string& activityName);

    virtual bool onKeyDown(int keyCode, KeyEvent& keyEvent);
    virtual bool onKeyUp(int keyCode, KeyEvent& keyEvent);
    virtual bool onKeyLongPress(int keyCode, KeyEvent& keyEvent);

   protected:
    virtual void onNotify(int notifyId, void* data);

   private:
    std::string mName;

    //@method 开始一个Activity的实际处理逻辑
    static void startActivityProc(const std::string& activityName);
    //@method 退出一个Activity的实际处理逻辑
    static void stopActivityProc(const std::string& activityName);
    //@method 退出栈顶Activity并开始一个Activity的实际处理逻辑
    static void stopTopAndStartActivityProc(const std::string& activityName);
    //@method 退出后台所有Activity并开始一个Activity的实际处理逻辑
    static void stopAllAndStartActivityProc(const std::string& activityName);
};

#endif /* CPP_CONTEXT_H */